/**
 * Author@ Cheng Feitian
 * Date: 2021-4-4
 * Description: 多态的基本概念
 * 多态原理 不是很懂
 */

#include <algorithm>
#include <iostream>
#include <string>

using namespace std;
const int maxn = 1024;

class Animal
{
public:
    //虚函数
    virtual void speak()
    {
        cout << "Animal is speaking!" << endl;
    }
};

class Cat : public Animal
{
public:
    //重写  函数返回值类型  函数名  参数列表    完全相同
    //子类中的virtual可写可不写
    virtual void speak()
    {
        cout << "Cat is speaking!" << endl;
    }
};

class Dog : public Animal
{
public:
    void speak()
    {
        cout << "Dog is speaking!" << endl;
    }
};

//执行说话的函数
//地址早绑定    在编译阶段确定函数地址
//如果想执行让猫说话，那么这个函数地址就不能提前绑定，需要在运行阶段进行绑定，地址晚绑定

// 动态多态满足条件
// 1.有继承关系
// 2.子类重写父类的虚函数

// 动态多态使用
// 父类的指针或者引用  指向子类对象

void doSpeak(Animal &animal)
{ //Animal & animal = cat;
    animal.speak();
}

void test01()
{
    Cat cat;
    doSpeak(cat);
    Dog dog;
    doSpeak(dog);
}

void test02(){
    cout << "sizeof(Animal) = " << sizeof(Animal) << endl;
}

int main()
{
    // test01();
    test02();
    return 0;
}
